#include <cstdio>
using namespace std;
typedef long long ll;
int read(){
	char c=getchar();int x=0;
	while(c<48||c>57) c=getchar();
	do x=x*10+(c^48),c=getchar();
	while(c>=48&&c<=57);
	return x;
}
const int M=100003;
const int P=1000000007;
int n,m,x,lb;
bool s[M];
int f[M][2];
int g[M][2];
int coe[M],bn[M];
int c[M][2];
inline void inc(int &x,int v){if((x+=v)>=P) x-=P;}
inline void dec(int &x,int v){if((x-=v)<0) x+=P;}
int main(){
	freopen("pearl.in","r",stdin);
	freopen("pearl.out","w",stdout);
	n=read();m=read();x=read();
	char cc=getchar();
	while(cc!=48&&cc!=49) cc=getchar();
	for(int i=0;i<m;++i) s[i]=(cc=='1'),cc=getchar();
	lb=0;
	while(lb<m&&!s[lb]) ++lb;
	bn[0]=1;
	for(int i=1;i<=m;++i) inc(bn[i]=bn[i-1],bn[i-1]);
	for(int i=0;i<m;++i) coe[i]=bn[m-i-1];
	coe[m]=1;
	int res=0;
	for(int it=0;it<=m;++it){
		int a[2]={0,0},b[2]={0,0};
		f[lb][0]=1;
		for(int i=1;i<x;++i){
			for(int j=0;j<=m;++j)
				for(int k=0;k<=m;++k)
					if(j+k>=it){
						inc(g[k][(j+k==it)],f[j][0]);
						inc(g[k][(j+k!=it)],f[j][1]);
					}
			for(int j=0;j<=m;++j){
				f[j][0]=(ll)g[j][0]*coe[j]%P,g[j][0]=0;
				f[j][1]=(ll)g[j][1]*coe[j]%P,g[j][1]=0;
			}
		}
		for(int j=0;j<=m;++j) inc(a[0],f[j][0]),inc(a[1],f[j][1]),f[j][0]=f[j][1]=0;
		f[lb][0]=1;
		for(int i=1;i<=n-x;++i){
			for(int j=0;j<=m;++j)
				for(int k=0;k<=m;++k)
					if(j+k>=it){
						inc(g[k][(j+k==it)],f[j][0]);
						inc(g[k][(j+k!=it)],f[j][1]);
					}
			for(int j=0;j<=m;++j){
				f[j][0]=(ll)g[j][0]*coe[j]%P,g[j][0]=0;
				f[j][1]=(ll)g[j][1]*coe[j]%P,g[j][1]=0;
			}
		}
		for(int j=0;j<=m;++j) inc(b[0],f[j][0]),inc(b[1],f[j][1]),f[j][0]=f[j][1]=0;
		c[it][0]=((ll)a[0]*b[0]+(ll)a[1]*b[1])%P;
		c[it][1]=((ll)a[0]*b[1]+(ll)a[1]*b[0])%P;
	}
	for(int i=0;i<m;++i){
		dec(c[i][0],c[i+1][0]);
		dec(c[i][0],c[i+1][1]);
	}
	for(int i=0;i<=m;++i){
		if(i<m) res=(res+(ll)c[i][1]*bn[i])%P;
		for(int j=i+1;j<m;++j) res=(res+(ll)(c[i][0]+c[i][1])*bn[j-1])%P;
	}
	printf("%d\n",res);
	return 0;
}
